// 给定正整数数组 A，A[i] 表示第 i 个观光景点的评分，并且两个景点 i 和 j 之间的距离为 j - i。
// 一对景点（i < j）组成的观光组合的得分为（A[i] + A[j] + i - j）：景点的评分之和减去它们两者之间的距离。
// 返回一对观光景点能取得的最高分。

function maxScoreSightseeingPair(A: number[]): number {
    let res: number = A[0];// 声明结果变量
    let maxI: number = 0;// 声明A[i]+ i的最大值变量
    for (let i = 1; i < A.length; i++) {
        // 不断地维护二者
        maxI = Math.max(A[i - 1] + i - 1, maxI);
        res = Math.max(maxI + A[i] - i, res);
    }
    return res;
};

// 这道题我认为能比较好诠释数学在算法设计中的重要性
// 乍一看好像是类似动态规划的算法题
// 但这里比较难处理的是同时要考虑两组具有位置约束关系的变量
// A[i] + A[j]和i - j
// 而且你不知道这两组变量中任意一组更新时另一组的变化趋势
// 这就比较困难
// 但其实结论上我们只需要对原式子做一个简单的加法交换律
// 把原式子变成A[i]+ i + A[j] - j这道题就变得简单很多了
// 这样每当我们统计一组新数组元素时A[j]−j 是固定不变的
// 因此最大化 A[i]+i+A[j]-j 的值
// 其实就等价于求 [0,j-1] 中 A[i]+i 的最大值
// 这样我们只需要不断地动态维护maxI，
// 再声明一个结果变量，不断地维护axI+当前元素的A[j] - j
// 就可以得到结果，所以如果数学思维敏感的话，想到的这个解法就非常巧妙...
